#include "access_token_timer.h"
#include "exchange_access_token_command.h"
#include "service/backend_service.h"
#include <QDebug>

AccessTokenTimer::AccessTokenTimer(QObject *parent)
    : QObject(parent)
    , m_timer(nullptr)
    , m_exchangeAccessTokenCommand(nullptr)
    , m_backendService(nullptr)
    , m_networkManager(nullptr)
{
    // 创建定时器
    m_timer = new QTimer(this);
    m_timer->setSingleShot(false); // 设置为重复定时器
    m_timer->setInterval(TIMER_INTERVAL_MS); // 设置间隔为1小时
    
    // 连接定时器超时信号
    connect(m_timer, &QTimer::timeout, this, &AccessTokenTimer::onTimerTimeout);
    
    // 创建 ExchangeAccessTokenCommand 实例
    m_exchangeAccessTokenCommand = new ExchangeAccessTokenCommand(this);
    
    qDebug() << "AccessTokenTimer: 已创建，定时器间隔:" << TIMER_INTERVAL_MS / 1000 / 60 << "分钟";
}

AccessTokenTimer::~AccessTokenTimer()
{
    stop();
    qDebug() << "AccessTokenTimer: 已销毁";
}

void AccessTokenTimer::setBackendService(BackendService *backendService)
{
    m_backendService = backendService;
    
    // 设置 ExchangeAccessTokenCommand 的 BackendService
    if (m_exchangeAccessTokenCommand) {
        m_exchangeAccessTokenCommand->setBackendService(backendService);
    }
    
    qDebug() << "AccessTokenTimer: 已设置 BackendService";
}

void AccessTokenTimer::setNetworkAccessManager(QNetworkAccessManager *networkManager)
{
    m_networkManager = networkManager;
    
    // 设置 ExchangeAccessTokenCommand 的 QNetworkAccessManager
    if (m_exchangeAccessTokenCommand) {
        m_exchangeAccessTokenCommand->setNetworkAccessManager(networkManager);
    }
    
    qDebug() << "AccessTokenTimer: 已设置 QNetworkAccessManager";
}

void AccessTokenTimer::start()
{
    if (!m_backendService || !m_networkManager) {
        qDebug() << "AccessTokenTimer: 无法启动，BackendService 或 QNetworkAccessManager 未设置";
        return;
    }
    
    if (m_timer && !m_timer->isActive()) {
        m_timer->start();
        qDebug() << "AccessTokenTimer: 定时器已启动，将在" << TIMER_INTERVAL_MS / 1000 / 60 << "分钟后首次执行";
        
        // 启动后立即执行一次（可选，如果需要立即刷新）
        executeRefresh();
    } else {
        qDebug() << "AccessTokenTimer: 定时器已经在运行中";
    }
}

void AccessTokenTimer::stop()
{
    if (m_timer && m_timer->isActive()) {
        m_timer->stop();
        qDebug() << "AccessTokenTimer: 定时器已停止";
    }
}

bool AccessTokenTimer::isActive() const
{
    return m_timer ? m_timer->isActive() : false;
}

void AccessTokenTimer::refreshNow()
{
    if (!m_backendService || !m_networkManager) {
        qDebug() << "AccessTokenTimer: 无法立即刷新，BackendService 或 QNetworkAccessManager 未设置";
        return;
    }
    
    qDebug() << "AccessTokenTimer: 立即执行 AccessToken 刷新";
    executeRefresh();
}

void AccessTokenTimer::onTimerTimeout()
{
    qDebug() << "AccessTokenTimer: 定时器超时，执行 AccessToken 刷新";
    executeRefresh();
}

void AccessTokenTimer::executeRefresh()
{
    if (!m_exchangeAccessTokenCommand) {
        qDebug() << "AccessTokenTimer: ExchangeAccessTokenCommand 未初始化";
        return;
    }
    
    qDebug() << "AccessTokenTimer: 开始执行 AccessToken 刷新";
    
    // 执行 ExchangeAccessTokenCommand（domainId 将在方法内部获取，异步操作）
    bool success = m_exchangeAccessTokenCommand->execute();
    
    if (success) {
        qDebug() << "AccessTokenTimer: AccessToken 刷新请求已发起（异步操作，结果将通过信号通知）";
    } else {
        qDebug() << "AccessTokenTimer: AccessToken 刷新请求发起失败";
    }
}

QString AccessTokenTimer::getCurrentDomainId() const
{
    if (!m_backendService) {
        qDebug() << "AccessTokenTimer: BackendService 未设置，无法获取公司ID";
        return QString();
    }
    
    // 从 BackendService 获取当前选中的公司ID
    QString domainId = m_backendService->loadSelectedCompanyId();
    
    if (domainId.isEmpty()) {
        qDebug() << "AccessTokenTimer: 当前没有选中的公司ID";
    }
    
    return domainId;
}

